package org.study.util;

import java.math.BigDecimal;

/**
 * 类的描述
 *
 * @author Administrator
 * @date 2021-05-28
 */
public class FloatUtils {
    private FloatUtils() {
        throw new AssertionError("不能实例化工具类！");
    }

    public static void main(String[] args) {
        float diff1 = 1e-6F;
        float diff2 = 0.000001F;
        System.out.println("输出：" + diff1 + ", " + diff2);
        System.out.println("输出：" + (diff1 == diff2));

        // 浮点数之间的等值判断，基本数据类型不能用 == 来比较，包装数据类型不能用 equals 来判断
        // 说明：浮点数采用“尾数+阶码”的编码方式，类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数
        float a = 1.0F - 0.9F;
        float b = 0.9F - 0.8F;
        if (a == b) {
            // 预期进入此代码块，执行其它业务逻辑，但事实上 a==b 的结果为 false
            System.out.println("==：" + true);
        } else {
            System.err.println("==：" + false);
        }
        if (Float.valueOf(a).equals(Float.valueOf(b))) {
            // 预期进入此代码块，执行其它业务逻辑，但事实上 equals 的结果为 false
            System.out.println("equals：" + true);
        } else {
            System.err.println("equals：" + false);
        }

        // 浮点数的比较可以"指定一个误差范围"或者"采用 BigDecimal"
        // 指定一个误差范围，两个浮点数的差值在此范围之内，则认为是相等的
        float diff = 1e-6F;// 即：0.000001F
        if (Math.abs(a - b) < diff) {
            System.out.println("diff：" + true);
        } else {
            System.err.println("diff：" + false);
        }
        // 使用 BigDecimal 来定义值，再进行浮点数的运算操作
        BigDecimal decimal1 = new BigDecimal("1.0");
        BigDecimal decimal2 = new BigDecimal("0.9");
        BigDecimal decimal3 = new BigDecimal("0.8");
        BigDecimal ret1 = decimal1.subtract(decimal2);
        BigDecimal ret2 = decimal2.subtract(decimal3);
        if (ret1.compareTo(ret2) == 0) {
            System.out.println("BigDecimal.compareTo：" + true);
        } else {
            System.err.println("BigDecimal.compareTo：" + false);
        }
    }
}
